/**
 * 简单工厂模式
 */
export class Apple {
    appleSeed: AppleSeed;
    sunlight: Sunlight;
    water: Water;
    constructor(appleSeed: AppleSeed, sunlight: Sunlight, water: Water) {
        this.appleSeed = appleSeed;
        this.sunlight = sunlight;
        this.water = water;
    }
}
export class AppleSeed {}
export class Sunlight {}
export class Water {}
export class Pear {}
class FruitFactory {
    create(type: string) {
        switch (type) {
            case '苹果':
                const appleSeed = new AppleSeed();
                const sunlight = new Sunlight();
                const water = new Water();
                return new Apple(appleSeed, sunlight, water);
            case '梨子':
                return new Pear();

            default:
                throw new Error('没有这种水果');
        }
    }
}
const fruiteFactory = new FruitFactory();
const apple = fruiteFactory.create('苹果');
const pear = fruiteFactory.create('梨子');

// 好处  无需知道水果如何生产
// 弊端
/**
 * 一是如果需要生产的产品过多，此模式会导致工厂类过于庞大，承担过多的职责，变成超级类。当苹果生产过程需要修改时，要来修改此工厂。
 *     梨子生产过程需要修改时，也要来修改此工厂。也就是说这个类不止一个引起修改的原因。违背了单一职责原则。
 * 二是当要生产新的产品时，必须在工厂类中添加新的分支。而开闭原则告诉我们：类应该对修改封闭。我们希望在添加新功能时，
 *     只需增加新的类，而不是修改既有的类，所以这就违背了开闭原则。
 */
